package com.example.demo.domain.base;

import com.example.demo.util.TraceUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 统一响应结果封装
 *
 * @param <T> 响应数据类型
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseResult<T> implements Serializable {
    /** 业务状态码 */
    private int code;
    /** 提示信息 */
    private String message;
    /** 响应数据 */
    private T data;
    /** 跟踪ID */
    private String traceId;

    /**
     * 成功响应（无数据）
     */
    public static <T> BaseResult<T> success() {
        return new BaseResult<>(0, "success", null, TraceUtil.getTraceId());
    }

    /**
     * 成功响应（带数据）
     */
    public static <T> BaseResult<T> success(T data) {
        return new BaseResult<>(0, "success", data, TraceUtil.getTraceId());
    }

    /**
     * 失败响应（默认错误码/信息）
     */
    public static <T> BaseResult<T> failure() {
        return new BaseResult<>(-1, "fail", null, TraceUtil.getTraceId());
    }

    /**
     * 失败响应（信息）
     */
    public static <T> BaseResult<T> failure(String message) {
        return new BaseResult<>(-1, message, null, TraceUtil.getTraceId());
    }

    /**
     * 失败响应（自定义错误码/信息）
     */
    public static <T> BaseResult<T> failure(int code, String message) {
        return new BaseResult<>(code, message, null, TraceUtil.getTraceId());
    }

    /**
     * 失败响应（自定义错误码/信息/数据）
     */
    public static <T> BaseResult<T> failure(int code, String message, T data) {
        return new BaseResult<>(code, message, data, TraceUtil.getTraceId());
    }
}
